// object表示一个js对象
let a: object;
a= {}
a = function () {}

// {}用来指定对象中可以包含哪些属性
// 语法: {属性名: 属性值,属性名: 属性值}
// 在属性名后边加上?，表示属性是可选的
let b: {name :string, age :number, weight? :number}
b = {name: '张三', age: 10}
b = {name: '张三', age: 10, weight: 20}

// [key: string]: any 表示任类型的属性
let c: {name: string, [key: string]: any}
c = {name: '李四', a: 1, b: false}

// 设置西数结构的类型声明:
// 语法:(形参:类型, 形参: 类型 ...) => 返回值
let d: (a: number, b: number) => void
d = (n1, n2) => {}

// string[] 表示字符申数组
let e: string[]
e= ['a', 'b', 'c']

// number[] 表示数值数组
let f: number[]
let g: Array<number>
g = [1, 2, 3]

/**
 * 元组，固定长度的数组
 * [类型, 类型...]
 */
let h: [string, number]
h = ['aa', 1]

/**
 * enum 枚举
 */
enum Gender {
    Male = 1,
    Female = 2
}
let i: {name: string, gender: Gender}
i = { name: '王五', gender: Gender.Male}

// &表示同时
let j: { name: string } & { age: number };
j= {name: '孙悟空', age: 18}

// 类型的别名
type myType = 1 | 2 | 3 | 4 | 5
let k: myType
let l: myType

type variable = string | number
let m: variable
m = 'aaa'
m = 1
// m = false
